package demo8;

import java.util.concurrent.TimeUnit;

class Phone {
    public static synchronized void sendEmail() throws Exception {
        TimeUnit.SECONDS.sleep(4);
        System.out.println("---send Email---");
    }

    public synchronized void sendSMS() throws Exception {
        System.out.println("---send SMS---");
    }
    public void sayHello() throws Exception {
        System.out.println("----sayHello----");
    }
}

/**
 * 8 lock
 * 1 标志访问，请问先打印邮件还是短信？不一定
 * 2 邮件方法暂停4秒，请问先打印邮件还是短信？邮件
 * 3 新增普通sayHello方法，请问先打印邮件还是hello? hello
 * 4 两部手机，请问先打印邮件还是短信? 邮件
 * 5 两个静态同步方法，同一部手机，请问先打印邮件还是短信？邮件
 * 6 两个静态同步方法，两部手机，请问先打印邮件还是短信？邮件
 * 7 一个静态同步方法，一个普通同步方法，同一部手机，请问先打印邮件还是短信？SMS          ************* 不会
 * 8 1个静态同步方法，一个普通同步方法，两部手机，请问先打印邮件还是短信？SMS
 *
 *
*
*  synchronized实现同步的基础：java中的每一个对象都可以作为锁
*  具体表现为以下3种形式
*  对于普通同步方法，锁是当前实例对象，锁的是当前对象this
*  对于同步方法块，锁是synchronized括号里配置的对象
*  对于静态同步方法，锁是当前类的Class对象
 *
 *
 * 一个对象，相当于有两个锁，一个类锁，一个对象锁。
 */
public class Lock8Demo05 {
    public static void main(String[] args) throws InterruptedException{
        Phone phone = new Phone();
        Phone phone2 = new Phone();
        new Thread(() -> {
            try {
                phone.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "A").start();

        Thread.sleep(100);

        new Thread(() -> {
            try {
                phone2.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "B").start();
    }
}
